//package com.charley.icloud.service.impl;
//
//import com.alibaba.fastjson.JSON;
//import com.auth0.jwt.internal.com.fasterxml.jackson.databind.ObjectMapper;
//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
//import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
//import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
//import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
//import com.charley.icloud.common.response.code.ResponseMsgConstants;
//import com.charley.icloud.common.response.result.ResponseHaveDataResult;
//import com.charley.icloud.common.response.result.ResponseHaveDataResultBuilder;
//import com.charley.icloud.common.response.result.ResponseResult;
//import com.charley.icloud.entity.SysUserEntity;
//import com.charley.icloud.mapper.SysUserMapper;
//import com.charley.icloud.service.SysUserService;
//import org.apache.commons.lang3.StringUtils;
//import org.springframework.stereotype.Service;
//import org.springframework.transaction.annotation.Transactional;
//
//import javax.annotation.Resource;
//import javax.servlet.http.Cookie;
//import javax.servlet.http.HttpServletRequest;
//import javax.servlet.http.HttpServletResponse;
//import java.net.SocketException;
//import java.util.ArrayList;
//import java.util.Date;
//import java.util.List;
//import java.util.concurrent.TimeUnit;
//import java.util.stream.Collectors;
//
///**
// * 业务逻辑接口实现类
// * MyBatis-Plus 版本
// *
// * @author charley
// * @date 2023-08-14 12:17
// */
//@Service
//public class SysUserServiceImpl extends ServiceImpl<SysUserMapper, SysUserEntity> implements SysUserService {
//
//    /*
//     * token过期时间 2 小时
//     * */
//    public static final int TOKEN_EXPIRE = 60 * 60 * 2;
//
//    @Resource
//    private SysUserMapper sysUserMapper;
//
//    @Resource
//    private RedisUtil redisUtil;
//
//    @Resource
//    private TokenUtil tokenUtil;
//
//    private final MapCache mapCache = MapCache.single();
//
//    @Override
//    public void insert(SysUserEntity user) {
//        sysUserMapper.insert(user);
//    }
//
//    @Override
//    @Transactional(rollbackFor = Exception.class)
//    public void insertTestTransactional(SysUserEntity user) {
//        sysUserMapper.insert(user);
//    }
//
//    @Override
//    public void update(SysUserEntity user) {
//        sysUserMapper.updateById(user);
//    }
//
//    @Override
//    public void deleteById(Long userId) {
//        sysUserMapper.deleteById(userId);
//    }
//
//    @Override
//    public Page<SysUserEntity> findAll(Page<SysUserEntity> page) {
//        return page.setRecords(sysUserMapper.findAll(page));
//    }
//
//    @Override
//    public List<SysUserEntity> findAll() {
//        return sysUserMapper.selectList(null);
//    }
//
//    @Override
//    public SysUserEntity findById(Long userId) {
//        SysUserEntity sysUser = sysUserMapper.selectById(userId);
//        if (sysUser == null) {
//            sysUser = new SysUserEntity();
//            sysUser.setNickname("charley");
//        }
//        return sysUser;
//    }
//
//    @Override
//    public SysUserEntity findByUsername(String username) {
//        return sysUserMapper.findByUsername(username);
//    }
//
//    @Override
//    public SysUserEntity findByAccount(String account) {
//        return sysUserMapper.findByAccount(account);
//    }
//
//    @Override
//    @Transactional(rollbackFor = Exception.class)
//    public void batchInsertOrUpdate(List<SysUserEntity> userList) {
//        // 批量检查用户名是否存在
//        List<String> usernameList = userList.stream().map(SysUserEntity::getUsername).collect(Collectors.toList());
//        List<String> existUsernameList = sysUserMapper.getExistByUsernameList(usernameList);
//
//        List<SysUserEntity> needInsertList = new ArrayList<>();
//        List<SysUserEntity> needUpdateList = new ArrayList<>();
//        for (SysUserEntity user : userList) {
//            if (existUsernameList.contains(user.getUsername())) {
//                needUpdateList.add(user);
//            } else {
//                needInsertList.add(user);
//            }
//        }
//
//        // 注意：mybatis批量操作入参最多1000条，如果超过1000条需要分组多次执行，这里先忽略
//        // 批量插入新数据
//        sysUserMapper.batchInsert(needInsertList);
//
//        // 批量更新旧数据
//        sysUserMapper.batchUpdate(needUpdateList);
//    }
//
//    /**
//     * 获取验证码
//     */
//    @Override
//    public ResponseHaveDataResult<CodeVo> codeGet(HttpServletRequest request, HttpServletResponse response) {
//        RandomValidateCodeUtil randomValidateCodeUtil = new RandomValidateCodeUtil();
//        String imgBaseStr = randomValidateCodeUtil.getRandCode1(request, response);
//        String code = String.valueOf(request.getSession().getAttribute("code"));
//        redisUtil.set(request.getSession().getId(), code, 2 * 60, TimeUnit.SECONDS);
//        CodeVo codeVo = new CodeVo();
//        codeVo.setCode(code);
//        codeVo.setSessionId(request.getSession().getId());
//        codeVo.setImgBaseStr("data:image/png;base64," + imgBaseStr);
//        return ResponseHaveDataResultBuilder.success(codeVo);
//    }
//
//    @Override
//    public ResponseResult logout(HttpServletRequest request) throws Exception {
//
//        String token = request.getHeader(SystemConstant.REQUEST_HEADER_TOKEN);
//
//        if (token == null) {
//            ResponseMsgResultBuilder.fail(ResponseMsgConstants.ACCESS_DENIED_MSG, ResponseMsgConstants.ACCESS_DENIED);
//        }
//
//        // 从Redis取出当前登录用户的信息
//        String userJson = redisUtil.get(RedisConstant.COOKIE_NAME_TOKEN + "::" + token);
//        if (userJson == null) {
//            ResponseMsgResultBuilder.fail(ResponseMsgConstants.ACCESS_DENIED_MSG, ResponseMsgConstants.ACCESS_DENIED);
//        }
//        // 重置有效期为10s，保证日志记录成功
//        redisUtil.expire(RedisConstant.COOKIE_NAME_TOKEN + "::" + token, 5);
//        SysUserEntity sysUser = JSON.parseObject(userJson, SysUserEntity.class);
//        assert sysUser != null;
//        redisUtil.del(RedisConstant.ALREADY_LOGIN + "::" + sysUser.getAccount());
//
//        return ResponseResultBuilder.success();
//    }
//
//    @Override
//    public ResponseHaveDataResult<SysUserEntity> registerUser(HttpServletRequest request, HttpServletResponse response, RegisterUser newUser) {
//        if (!PatternKit.isEmail(newUser.getEmail())) {
//            return ResponseHaveDataResultBuilder.fail("邮箱格式不正确，请核验...");
//        }
//        if (!PatternKit.isPhone(newUser.getMobilePhoneNumber())) {
//            return ResponseHaveDataResultBuilder.fail("手机号码格式不正确，请核验...");
//        }
//
//        // 判断手机、昵称和邮箱是否已被使用
//        LambdaQueryWrapper<SysUserEntity> queryWrapper = new LambdaQueryWrapper<>();
//        queryWrapper.eq(SysUserEntity::getEmail, newUser.getEmail())
//                .or().eq(SysUserEntity::getMobilePhoneNumber, newUser.getMobilePhoneNumber())
//                .or().eq(SysUserEntity::getNickname, newUser.getNickname());
//        List<SysUserEntity> sysUsers = sysUserMapper.selectList(queryWrapper);
//        if (sysUsers != null && sysUsers.size() > 0) {
//            for (SysUserEntity sysUser : sysUsers) {
//                if (sysUser.getEmail().equals(newUser.getEmail())) {
//                    return ResponseHaveDataResultBuilder.fail("该邮箱已被使用，请确认邮箱是否填写正确或更换邮箱尝试...");
//                } else if (sysUser.getNickname().equals(newUser.getNickname())) {
//                    return ResponseHaveDataResultBuilder.fail("该昵称已被使用，请再换一个吧...");
//                } else if (sysUser.getMobilePhoneNumber().equals(newUser.getMobilePhoneNumber())) {
//                    return ResponseHaveDataResultBuilder.fail("该手机号已被使用，请确认手机号是否填写正确或更换手机号尝试...");
//                }
//            }
//        }
//
//        // 组装新用户信息
//        ObjectMapper objectMapper = new ObjectMapper();
//        SysUserEntity sysUser = objectMapper.convertValue(newUser, SysUserEntity.class);
//        Date date = new Date();
//        sysUser.setAccount(DateUtils.dateTimeNow()); // 根据当前时间生成账号
//        sysUser.setPassword(MD5Util.getMD5ofStr(newUser.getPassword())); // 密码加密处理
//        sysUser.setAdmin(false);
//        sysUser.setCreatedTime(date);
//        sysUser.setUpdatedTime(date);
//        sysUser.setCreatedBy("system");
//        sysUser.setUpdatedBy("system");
//        sysUser.setDeleted(false);
//        int insert = sysUserMapper.insert(sysUser);
//        if (insert == 1) {
//            sysUser.setPassword(newUser.getPassword());
//            return ResponseHaveDataResultBuilder.success(sysUser);
//        } else {
//            return ResponseHaveDataResultBuilder.fail("网络异常，请稍后再试");
//        }
//    }
//
//    @Override
//    public ResponseHaveDataResult<AuthVo> getUserInfo(HttpServletRequest request) throws Exception {
//        String token = request.getHeader(SystemConstant.REQUEST_HEADER_TOKEN);
//
//        if (token == null) {
//            ResponseMsgResultBuilder.fail(ResponseMsgConstants.ACCESS_DENIED_MSG, ResponseMsgConstants.ACCESS_DENIED);
//        }
//
//        // 从Redis取出当前登录用户的信息
//        String userJson = redisUtil.get(RedisConstant.COOKIE_NAME_TOKEN + "::" + token);
//        if (userJson == null) {
//            ResponseMsgResultBuilder.fail(ResponseMsgConstants.ACCESS_DENIED_MSG, ResponseMsgConstants.ACCESS_DENIED);
//        }
//
//        AuthVo authVo = JSON.parseObject(userJson, AuthVo.class);
//
//        return ResponseHaveDataResultBuilder.success(authVo);
//
//    }
//
//    /**
//     * 登录
//     */
//    @Override
//    public ResponseHaveDataResult<AuthVo> login(HttpServletRequest request, HttpServletResponse response, AuthParams query) {
//        Integer errCount = mapCache.get(SystemConstant.LOGIN_ERROR_COUNT);
//        if (errCount != null && errCount > 3) {
//            return ResponseHaveDataResultBuilder.fail("您输入密码已经错误超过3次，请10分钟后尝试");
//        }
//
//        // 从Redis中取出验证码验证是否正确
//        String code = redisUtil.get(query.getSessionId());
//        if (code == null) {
//            return ResponseHaveDataResultBuilder.fail("验证码已过期，请刷新", "601");
//        }
//        if (query.getCode() == null || !query.getCode().equalsIgnoreCase(code)) { // 忽略大小写
//            return ResponseHaveDataResultBuilder.fail("请输入正确的验证码", "601");
//        }
//
//        // 判断用户账号是否存在
//        SysUserEntity user = findByAccount(query.getAccount());
//        if (user == null) {
//            //throw new GlobalException(CodeMsg.ACCOUNT_NOT_EXIST);
//            return ResponseHaveDataResultBuilder.fail("账号不存在...", "601");
//        }
//
//        // 验证用户是已经登录
//        String already = redisUtil.get(RedisConstant.ALREADY_LOGIN + "::" + user.getAccount());
//        if (already != null) {
//            return ResponseHaveDataResultBuilder.fail("该账号已登录...", "601");
//            //throw new GlobalException(CodeMsg.USER_ALREADY_LOGIN);
//        }
//        // 验证密码，将用户密码进行加密
//        String password = MD5Util.getMD5ofStr(query.getPassword());
//        if (!password.equals(user.getPassword())) {
//            errCount = errCount == null ? 1 : errCount + 1;
//            mapCache.set(SystemConstant.LOGIN_ERROR_COUNT, errCount, 10 * 60);
//            //throw new GlobalException(CodeMsg.PASSWORD_ERROR);
//            return ResponseHaveDataResultBuilder.fail("密码错误，请重试...", "601");
//        }
//
//        /* *****************  用户登录通过验证后   ***************** */
//        // 记录用户上次登录的时间
//        UpdateWrapper<SysUserEntity> updateWrapper = new UpdateWrapper<>();
//        updateWrapper.eq("id", user.getId());
//        updateWrapper.set("last_login", DateUtils.getDateTime());
//        sysUserMapper.update(null, updateWrapper);
//
//        ObjectMapper objectMapper = new ObjectMapper();
//        AuthVo authVo = objectMapper.convertValue(user, AuthVo.class);
//        // 生成cookie，名为 token
//        String token = tokenUtil.getToken(user.getAccount());
//        //String token = UUID.randomUUID().toString().replace("-","");
//        authVo.setToken(token);
//        authVo.setPassword(null); //密码置空
//
//        /* -----------------   要增加admin登录各种账号的权限，后续优化   ---------------------- */
//        addCookie(response, token, user);
//
//        return ResponseHaveDataResultBuilder.success(authVo);
//    }
//
//    @Override
//    public SysUserEntity getByToken(HttpServletResponse response, String token) {
//        if (StringUtils.isEmpty(token)) {
//            return null;
//        }
//        SysUserEntity user = JSON.parseObject(redisUtil.get(RedisConstant.COOKIE_NAME_TOKEN + "::" + token), SysUserEntity.class);
//        //重置有效期
//        if (user == null) {
//            throw new GlobalException(CodeMsg.USER_NOT_LOGIN);
//        }
//        if (response != null) {
//            addCookie(response, token, user);
//        }
//        return user;
//    }
//
//    @Override
//    public SysUserEntity getByToken(String token) {
//        return getByToken(null, token);
//    }
//
//    @Override
//    public SysUserEntity getLoginUser(HttpServletRequest request) {
//        return getLoginUser(request, null);
//    }
//
//    @Override
//    public SysUserEntity getLoginUser(HttpServletRequest request, HttpServletResponse response) {
//        String paramToken = request.getParameter(RedisConstant.COOKIE_NAME_TOKEN);
//        //String cookieToken = getCookieValue(request);
//        String cookieToken = request.getHeader("Auth-Token");
//        if (StringUtils.isEmpty(cookieToken) && StringUtils.isEmpty(paramToken)) {
//            // return null;
//            throw new GlobalException(CodeMsg.TOKEN_INVALID);
//        }
//        String token = StringUtils.isEmpty(paramToken) ? cookieToken : paramToken;
//        if (response == null) {
//            return getByToken(token);
//        }
//        return getByToken(response, token);
//    }
//
//    private String getCookieValue(HttpServletRequest request) {
//        Cookie[] cookies = request.getCookies();
//        if (cookies == null || cookies.length <= 0) {
//            // return null;
//            throw new GlobalException(CodeMsg.TOKEN_INVALID);
//        }
//        for (Cookie cookie : cookies) {
//            if (cookie.getName().equals(RedisConstant.COOKIE_NAME_TOKEN)) {
//                return cookie.getValue();
//            }
//        }
//        return null;
//    }
//
//    private void addCookie(HttpServletResponse response, String token, SysUserEntity user) {
//        //将token存入到redis
//        redisUtil.set(RedisConstant.COOKIE_NAME_TOKEN + "::" + token, JSON.toJSONString(user), TOKEN_EXPIRE);
//        try {
//            // 用来判断用户是否已登录，并验证 ip 是否改变
//            redisUtil.set(RedisConstant.ALREADY_LOGIN + "::" + user.getAccount(), IpInfoUtil.getRealIp(), TOKEN_EXPIRE);
//        } catch (SocketException e) {
//            e.printStackTrace();
//        }
//        //将token写入cookie
//        Cookie cookie = new Cookie(RedisConstant.COOKIE_NAME_TOKEN, token);
//        cookie.setMaxAge(TOKEN_EXPIRE); // 设置有效期
//        cookie.setPath("/");
//        response.addCookie(cookie); //响应Cookie信息
//    }
//
//}
